// 封装 
// 类 对具有相同特性与行为的对象下的定义，是对象的一个模版
#include <iostream>
#include <string>

using namespace std;

// 定义person类：1 属性 变量 字段 2 方法 函数
class Person
{
private:
    string _name;    //成员变量 m_xxx member _xxx
    int _age;
public:
    // 与类的名字相同，没有写返回值
    // 构造函数 
    // 重载：同名方法，因参数类型与参数个数不同，衍生出不同的版本，编译时会选择特定方法执行，静态时多态
    Person() {
        _name = "路人甲";
        _age = 18;
        cout << "Person()" << endl;
    }
    Person(string n){
        _name = n;
        _age = 20;
        cout << "Person(string n)" << endl;
    }
    Person(string n, int a) 
    :_name(n)
    ,_age(a)
    {
        // _name = n;
        // _age = a;
        cout << "Person(string n ,int a)" << endl;
    }
    // 析构函数
    // 
    ~Person() {
        cout << "~Person()" << endl;
    }
    // 自定义函数:与数据相关的操作封装在类的内部
    void show() {
        cout << "姓名：" << _name << endl;
        cout << "年龄：" << _age << endl;
    }
    // getter setter 访问成员变量
    int getage() {
        return _age;
    }
    void setage(int n) {
        // 检查参数
        // 有效执行，无效抛出异常
        if(n >= 18 && n <= 65) {
            _age = n;
        }
    }
};

int main(int argc, char const *argv[])
{
    // Person p1;  //创建一个 person 对象（实例）
    // p1.show();

    // Person p2("ls");
    // p2.show();

    // Person p3{"zs", 20};
    // p3.show();

    // 声明Person类型指针
    Person *p; //没有创建对象
    p = new Person("king", 99);
    // 封装保护数据
    // p->_age = 1000;
    p->show();
    // 释放
    delete p;
    return 0;
}
